-- 基于redis的stream队列进行下单
--
---- 1、参数列表
---- 1.1、优惠卷 id
local voucherId = ARGV[1]
-- 1.2、用户 id
local userId = ARGV[2]
-- 1.3、订单id
local orderId = ARGV[3]

-- 2、数据 key
-- 2.1、库存 key
local stockKey = 'seckill:stock:' .. voucherId
-- 2.2、用户 key
local orderKey = 'seckill:order:' .. voucherId

-- 3、业务
-- 3.1、判断是否有库存
if (tonumber(redis.call('get',stockKey)) > 0)
then
    -- 3.2、判断是否买过，即 set 是否有这个 userId
    if (tonumber(redis.call('sismember',orderKey,userId)) == 0)
    then
        -- 3.2.1、扣减库存，存放 userId
        redis.call('incrby',stockKey,-1)
        redis.call('sadd',orderKey,userId)
        -- 3.2.2、将订单信息放到消息队列    xadd key *|id userId userId voucherId voucherId id orderId
        redis.call('xadd','stream.orders','*','userId',userId,'voucherId',voucherId,'id',orderId)
    else
        -- 3.3、用户买过了
        return 2
    end
else
    -- 3.4、没有库存
    return 1
end
return 0


---- 判断是否有秒杀资格，先判断是否有库存，再判断是否买过
---- 一、添加库存，已经将库存数量保存到 redis，seckill:lock:voucherId
---- 二、查看 redis 的 set 是否有该用户的 userId

--1.参数列表
--1.1优惠券id
--local voucherId = ARGV[1]
----1.2用户id
--local userId = ARGV[2]
----1.3订单id
--local orderId = ARGV[3]
--
----2.数据key
----2.1库存key
--local stockKey = "seckill:stock:" .. voucherId
----2.2订单key
--local orderKey = "seckill:order:" .. voucherId
--
----3.脚本业务
----3.1判断库存是否充足 get stock
--redis.call('set','stockkey',stockKey)
--if (tonumber(redis.call('get', stockKey)) <= 0) then
--    --库存不足返回1
--    return 1
--end
--redis.call('set', 'stockkey', '1')
----3.2判断用户是否下单
--if (redis.call('sismember', orderKey, userId) == 1) then
--    --存在，返回2
--    return 2
--end
--redis.call('set', 'orderKey', '1')
----3.3扣库存incrby stockKey -1
--redis.call('incrby', stockKey, -1)
----3.4下单，保存用户信息 sadd orderKey userId
--redis.call('sadd', orderKey, userId)
----3.5 发送消息到redis stream队列，xadd stream.orders * k1 v1 k2 v2......
--redis.call('xadd', 'stream.orders', '*', 'userId', userId, 'voucherId', voucherId, 'id', orderId)
--return 0